package com.eliza.kotlin.design.creation.factory.method_4

/**
 **优点：**

- 用户只需要知道具体工厂的名称就可得到所要的产品，无须知道产品的具体创建过程；
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类，无须对原工厂进行任何修改，满足开闭原则；

 **缺点：**

 * 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类，这增加了系统的复杂度。


 */
class CoffeeStore {
    private var factory: CoffeeFactory? = null
    fun setFactory(factory: CoffeeFactory) {
        this.factory = factory
    }

    //点咖啡功能
    fun orderCoffee(): Coffee {
        val coffee = factory!!.createCoffee()
        //加配料
        coffee.addMilk()
        coffee.addsugar()
        return coffee
    }
}

internal object Client {
    @JvmStatic
    fun main(args: Array<String>) {
        //创建咖啡店对象
        val store = CoffeeStore()
        //创建对象
        //CoffeeFactory factory = new AmericanCoffeeFactory();


        /* 设置具体工厂 */
        val factory: CoffeeFactory = LatteCoffeeFactory()
        store.setFactory(factory)

        //点咖啡
        val coffee = store.orderCoffee()
        println(coffee.name)
    }
}